"""
@Project ：python
@File    ：03-动态GDP柱状图.py
@IDE     ：PyCharm
@Author  ：DongCha
@Date    ：2024/4/8 008 16:16
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.globals import ThemeType
from pyecharts.options import LabelOpts, TitleOpts

# # sort(key=选择排序依据的函数, reverse=True|False)
# # 参数 key 要求传入一个函数，表示将列表的每一个元素都传入函数中，返回排序的依据
# # 参数 reverse 是否反转排序结果，True 为降序，False 为升序
#
# # 准备列表
# my_list = [["a", 1], ["b", 3], ["c", 2], ["d", 8], ["e", 6]]
#
#
# # # 排序规则
# # def choose_sort_key(element):
# #     return element[1]
# #
# #
# # # 排序
# # my_list.sort(key=choose_sort_key)
# my_list.sort(key=lambda element: element[1])
#
# print(my_list)

# 读取数据
with open("./数据/1960-2019全球GDP数据.csv", "r", encoding="utf-8") as f:
    data_lines = f.readlines()
    # 删除第一条数据
    data_lines.pop(0)
    # 将数据转为字典
    # {年份: [[国家, gdp], [国家, gdp], ...], 年份: [[国家, gdp], [国家, gdp], ...], ...}
    data_dict = {}
    for line in data_lines:
        year = int(line.split(",")[0])  # 年份
        country = line.split(",")[1]  # 国家
        gdp = float(line.split(",")[2])  # gdp
        # 向字典添加数据
        try:
            # 第一次添加此年份（没有到当前key）
            data_dict[year]
        except KeyError:
            # 添加新年份（key）
            data_dict[year] = []
            data_dict[year].append([country, gdp])
        else:
            # 向年份中添加国家（向 key 添加 value）
            data_dict[year].append([country, gdp])
# 创建时间线对象
timeline = Timeline({"theme": ThemeType.LIGHT})
# 按年份排序 从小到大
sorted_year = sorted(data_dict.keys())
for year in sorted_year:
    # 按照gdp进行排序 从大到小
    data_dict[year].sort(key=lambda element: element[1], reverse=True)
    # 获取前八位
    year_data = data_dict[year][0:8]
    x_data = []
    y_data = []
    # 获取这一年对应的国家、gdp
    for c_g in year_data:
        x_data.append(c_g[0])
        # round(x, y) 最多保留数字 x 的 y 位小数
        y_data.append(round(c_g[1] / 100000000, 0))
    # 创建柱状图
    # for 循环每一年数据，基于每一年的数据创建柱状图对象
    bar = Bar()
    # 反转数据，使其从大到小排列
    x_data.reverse()
    y_data.reverse()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position="right"))
    # 反转 x y 轴
    bar.reversal_axis()
    # 设置标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年全球前八GDP")
    )
    # 在 for 中将每一年的柱状图对象添加到时间线对象中
    timeline.add(bar, str(year))
# 设置时间线自动播放
timeline.add_schema(
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=True,
    play_interval=1000
)
# 绘图
timeline.render("./bars/gdp.html")
